CircleCIでプロジェクトごとに設定した環境変数の値を確認したい
こんにちは、CX事業本部の若槻です。
今回は、CircleCircleCIの[project settings]-[Environment Variables]で設定した環境変数の値を確認するTipsです。
登録済みの環境変数は[project settings]-[Environment Variables]の画面では確認できなくなる
CircleCIではプロジェクトごとに利用したい環境変数を画面コンソールの[project settings]-[Environment Variables]から設定することができます。
しかし登録後は値の末尾4文字以外がマスクされて、コンソールから環境変数の値は確認できなくなってしまいます。
セキュリティ的にはこれで良いのかもしれませんが、「同じ環境変数を別のプロジェクトでも設定したい!」という場合などには別途方法により確認が必要となります。
確認できなかった方法
[project settings]-[Environment Variables]で設定した環境変数を確認する方法を探っていきます。まずは確認できなかった方法です。
ブラウザのディベロッパーツールを使う
よくあるWebサービスのパスワード入力画面のように、ブラウザ画面上への表示だけマスクしているが、実際のDOM上では未加工の値が使われているのでは?と思い、ブラウザのディベロッパーツールから[project settings]-[Environment Variables]を見てみましたが、確認できませんでした。
[Preparing Environment Variables]STEPの画面出力を確認する
実行されたworkflowでは[Preparing Environment Variables]というSTEPが実行され、実行内で利用可能な環境変数をコンソールから確認することができます。
ただし、[environment variables]より設定した環境変数に関しては、**REDACTED**
とマスクが入り、確認できませんでした。
echo
コマンドで画面出力する
環境変数をecho
コマンドで画面出力してみます。テンプレートは下記のようになります。
version: 2 jobs: get_envs: docker: - image: circleci/hello steps: - run: name: test command: | echo 'account_id: '${account_id} echo 'access_key_id: '${access_key_id} echo 'secret_access_key: '${secret_access_key} workflows: version: 2 workflow: jobs: - get_envs
画面出力はproject settingsの環境変数の値部分のみマスクされ、確認できませんでした。
ファイルに書き込んだ内容を画面出力する
環境変数を一度ファイルに書き込み、その内容を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)
steps: - run: name: test command: | env > env.txt cat env.txt
画面出力はproject settingsの環境変数の値部分のみマスクされ、確認できませんでした。
確認できた方法
続いて確認できた方法です。
末尾の文字を除いてスライスした結果を画面出力する
環境変数の値を末尾4文字を除いてスライスした結果を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)
steps: - run: name: test command: | echo ${access_key_id:0:-4}
末尾4文字を除いた値がマスクされず画面出力され、確認することができました。
値の末尾4文字は[project settings]-[Environment Variables]から確認可能なので、これらを合わせれば値の全文が確認可能となります。
暗号化して画面出力する
環境変数の値をbase64暗号化した結果を画面出力してみます。configファイルは下記のようになります。(変更部分以外省略)
steps: - run: name: test command: | echo $access_key_id | base64
画面出力することができました。
画面出力した暗号化文字列をbase64で復号することにより、環境変数の値を確認することができました。
$ echo 'MTIzNGFiY2Q1Njc4ZWZnaAo=' | base64 -d 1234abcd5678efgh
ファイルに書き込んでArtifactsに保存する
環境変数の値をファイルに書き込み、そのファイルを組み込み関数のstore_artifacts
でArtifactsに保存します。configファイルは下記のようになります。(変更部分以外省略)
steps: - run: name: test command: | echo 'account_id: '${account_id} >> env.txt echo 'access_key_id: '${access_key_id} >> env.txt echo 'secret_access_key: '${secret_access_key} >> env.txt - store_artifacts: path: env.txt
STEPの実行結果です。
workflowの[Artifacts]タブを開くと、env.txt
がダウンロード可能となっています。
ダウンロードしたファイルを開くと、環境変数の値が確認できました。
おまけ
環境変数に設定した値と同じ値をただ画面出力するようにしてみます。
steps: - run: name: test command: | echo '1234567890' - store_artifacts: path: env.txt
環境変数を参照したわけではないのに値の画面出力がマスクされました。どうやらマスクの基準は、環境変数の値で検索をかけて一致する文字列があればマスクする、というもののようです。
おわりに
今回はまるでサービスの抜け道を探すような内容となり、少し悪いことをしている気持ちにもなりましたが、CircleCIの仕様とセキュリティの工夫の理解につながって良かったです。Tipsとしてお役に立てば幸いです。
以上